Et si {shiny} n’existait pas ?

Cervan Girard

Partage d’experience

Le cousin de mon cousin

{shiny}

  • Développer des applications Web avec R

Comment ça marche :

UI

ui <- fluidPage(

    # Application title
    titlePanel("Old Faithful Geyser Data"),

    # Sidebar with a slider input for number of bins 
    sidebarLayout(
        sidebarPanel(
            sliderInput("bins",
                        "Number of bins:",
                        min = 1,
                        max = 50,
                        value = 30)
        ),

        # Show a plot of the generated distribution
        mainPanel(
           plotOutput("distPlot")
        )
    )
)

Serveur

server <- function(input, output) {

    output$distPlot <- renderPlot({
        # generate bins based on input$bins from ui.R
        x    <- faithful[, 2]
        bins <- seq(min(x), max(x), length.out = input$bins + 1)

        # draw the histogram with the specified number of bins
        hist(x, breaks = bins, col = 'darkgray', border = 'white',
             xlab = 'Waiting time to next eruption (in mins)',
             main = 'Histogram of waiting times')
    })
}

Une implementation particulière

  • code only

Et pourtant:

Sommes nous tous des développeurs Web ?

Et si shiny n’existait pas ?

Comment se sortir de cette impasse ?

Retour d’experience d’un dev {shiny} dans un monde où {shiny} n’existe pas !

Pour mieux comparer : comprendre {shiny}

La quête du savoir ^^

if (shiny) web_skill == 0

La quête du savoir ^^

WEBSOCKET

La quête du savoir ^^

C’est quoi les websockets ?

Comprendre les ws

Comparaison avec un téléphone :

Les websockets :

Les API Rest

Mon chemin tracé vers mon but

Coder une application web avec R et sans {shiny}

Ce que je devais apprendre

Pour la partie front :

Pour la partie backend :

Une simple page et une requête

HTML:

    <div class="paper container">
      <h1>My super web application with R</h1>
      <p>Select a Species</p>
      <div class="form-group">
        <label for="paperSelects1">Species</label>
        <select id="paperSelects1">
          <option value="versicolor">Versicolor</option>
          <option value="setosa">Setosa</option>
          <option value="virginica">Virginica</option>
        </select>
      </div>
      <p>Here a space for my ggplot 2</p>
      <div id="my_ggplot">
      </div>

CSS:
paper.css

JS:

select_ = document.getElementById('paperSelects1')

select_.addEventListener("change",function(){
   fetch("http://localhost:3838/species/" + select_.value ) 
   .then(reponse => reponse.json())
   .then(data => 
      document
      .getElementById('my_ggplot')
      .innerHTML = data.html_url)
  });

Backend Un express like en R {ambiorix}

app <- Ambiorix$new(port = "3838")

app$get("/species/:id", \(req, res){
  res$header("Access-Control-Allow-Origin", "*")
  data_slot <- iris %>%
    filter(Species == req$params$id)
  temp_ <- tempfile(fileext = ".png")
  ggsave(temp_, ggplot(data = data_slot) +
    aes(x = Sepal.Length, y = Sepal.Width) +
    geom_point())
  temp_ <- knitr::image_uri(temp_)
  data <- list(html_url = sprintf('<img src="%s">', temp_))
  res$json(data)
})

app$start()

Une app avec R mais sans {shiny}

Finalement, qu’est ce que je retiens ?

Et dans les autres languages en 2023 ?

API ou websocket

{shiny} <3

  • Merci !
  • Une chance que ça existe car ça ouvre la porte au développement web
  • C’est pas unique à R, il y a donc bien un public
  • C’est plus rapide et donc moins coûteux
  • Une forme d’expertise sur les WS

{shiny} </3

  • Des compétences moins transférables
  • La scalabilité est pas simple

Oui, nous sommes des devs Webs ! ^^

Ouverture sur un avenir radieux ?

Merci !